AWS SAM
AWS Lambda とサーバレス開発フレームワーク
AWS Lambda を中心に据えたサーバーレス開発用のフレームワークは、有名どころとして以下がある。
Serverless Framework
AWS SAM
前者は OSS、後者は AWS が公式にサポートしている。
AWS SAM とは
AWS CloudFormation をベースとした、AWS 上のサーバーレスアプリケーションの定義を行うためのモデル。
サンプルプロジェクト
サンプルプロジェクトがいくつか公開されている。例えば、Java のサンプルプロジェクトは以下にある。
aws-serverless-java-container/samples at master · awslabs/aws-serverless-java-container
Swagger との連携
拡張が用意されている。
Swagger に対する API Gateway 拡張 - Amazon API Gateway
バージョニング
デプロイ節でも説明するが、エイリアスとバージョンの発行を有効にすることができる。
https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#referencing-lambda-version--alias-resources
デプロイ
Gradual Code Deployment
AWS SAM は、CodeDeploy を利用したデプロイをサポートしている。これは以下をしてくれる。
新しいバージョンの作成と、それを指すエイリアスの作成
新しいバージョンが期待通りに動いていることを確認できるまで、ユーザのトラフィックを徐々に動かしていく
新しくデプロイしたコードが正しく動作するか検証するために、pre-traffic および post-traffic を定義できる
CloudWatch alarm がトリガーされたら、デプロイをロールバックする
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html
https://aws.amazon.com/jp/blogs/compute/implementing-safe-aws-lambda-deployments-with-aws-codedeploy/
つまりどういうことができる?
通常、Lambda をデプロイする際は、コードをアプロードして終わりで、何か問題があれば以前のコードをあげなおすことでロールバックする。あるいは、エイリアスを利用して、問題があればエイリアスだけ前のバージョンを指すようにもどしてロールバックする。
AWS SAM では、以前はバージョニングに関する機能がなく、コードをあげ直してロールバックするしかなかった。が、CodeDeploy を利用することで、むしろより高機能になった。
AWS Lambda の CloudWatch メトリクス には、一定時間内の Lambda のエラー発生率がある。AWS SAM を利用すると、 以前の関数から最新の関数へトラフィックを徐々に移行していき、エラー発生率が閾値を超えたら、デプロイを中止して巻き戻す といったことができるようになる。とても便利。
また、デプロイの前後に Lambda 関数を実行することもできる。ここで E2E テストを試してからデプロイ、みたいなこともできる!
設定方法
code:yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
AutoPublishAlias: live
DeploymentPreference:
Type: Canary10Percent10Minutes
Alarms:
# A list of alarms that you want to monitor
- !Ref AliasErrorMetricGreaterThanZeroAlarm
- !Ref LatestVersionErrorMetricGreaterThanZeroAlarm
Hooks:
# Validation Lambda functions that are run before & after traffic shifting
PreTraffic: !Ref PreTrafficLambdaFunction
PostTraffic: !Ref PostTrafficLambdaFunction
設定項目は以下
AutoPublishAlias: <エイリアス名>
以下を実施する
Amazon S3 URI の変更から、コードの変更を検知する
新しいバージョンを作成する
エイリアスが存在しなければエイリアスを作成し、エイリアスを最新バージョンに向ける
他のイベントソースがエイリアスを指していなければ、この機能は意味がない
Type: <タイプ名>
デプロイタイプ。大きく以下の三種類
Canary:
Y分毎にXパーセントずつ新しいLambda関数へトラフィックを流し、100%になるまでこれを継続する
Linear:
XパーセントのトラフィックをY分間新しいLambda関数へ流し、その後一気に100パーセントのトラフィックを流す
All-at-once: 一気に全てのトラフィックを切り替える
Alarms: <CloudWatch Alarm の ARN>
デプロイ時にモニタリングするアラーム。アラートが出たらロールバックする
Hooks: <Lambda 関数の ARN>
事前/事後に実施する Lambda 関数
https://dev.classmethod.jp/server-side/serverless/understanding-lambda-deploy-with-codedeploy-using-aws-sam/